﻿namespace LogicStudio.Framework.UI.Comun
{
    using System.ComponentModel;
    using System.ServiceModel.DomainServices.Client;

    public class ModeloFramework : INotifyPropertyChanged
    {
        #region Atributos

        private bool _estaProcesando;
        private bool _habilitadoConsultar;
        private bool _habilitadoInsertar;
        private bool _habilitadoEliminar;
        private bool _habilitadoModificar;

        #endregion

        #region Constantes

        public const string PropiedadEstaProcesando = "EstaProcesando";
        public const string PropiedadHabilitadoConsultar = "HabilitadoConsultar";
        public const string PropiedadHabilitadoInsertar = "HabilitadoInsertar";
        public const string PropiedadHabilitadoEliminar = "HabilitadoEliminar";
        public const string PropiedadHabilitadoModificar = "HabilitadoModificar";
        public const string ExpresionInvocarOperacionFallida = "Invoke operation '{0}' failed.";

        #endregion

        #region Eventos

        /// <summary>
        /// Controlador de eventos del tipo <see cref="PropertyChangedEventHandler"/>
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region Métodos Públicos

        /// <summary>
        /// Notifica el cambio en una propiedad
        /// </summary>
        /// <param name="nombrePropiedad">
        /// Nombre de la propiedad a notificarse
        /// </param>
        public void RaisePropertyChanged(string nombrePropiedad)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(nombrePropiedad));
            }
        }

        public string ObtenerMensajeOperacion(InvokeOperation operacion)
        {
            try
            {
                var expresionReemplazar = string.Format(ExpresionInvocarOperacionFallida, operacion.OperationName);
                var mensaje = operacion.Error.Message.Replace(expresionReemplazar, string.Empty).Trim();
                return mensaje;
            }
            catch
            {
                return string.Empty;
            }
        }

        #endregion

        #region Propiedades

        /// <summary>
        /// Propiedad que indica si se encuentra en proceso o no
        /// </summary>
        public bool EstaProcesando
        {
            get
            {
                return _estaProcesando;
            }
            set
            {
                if (_estaProcesando == value)
                {
                    return;
                }

                _estaProcesando = value;
                RaisePropertyChanged(PropiedadEstaProcesando);
            }
        }

        /// <summary>
        /// Propiedad que indica si se posee el permiso para consultar
        /// </summary>
        public bool HabilitadoConsultar
        {
            get
            {
                return _habilitadoConsultar;
            }
            set
            {
                if (value == _habilitadoConsultar)
                {
                    return;
                }

                _habilitadoConsultar = value;
                RaisePropertyChanged(PropiedadHabilitadoConsultar);
            }
        }

        /// <summary>
        /// Propiedad que indica si se posee el permiso para insertar
        /// </summary>
        public bool HabilitadoInsertar
        {
            get
            {
                return _habilitadoInsertar;
            }
            set
            {
                if (value == _habilitadoInsertar)
                {
                    return;
                }

                _habilitadoInsertar = value;
                RaisePropertyChanged(PropiedadHabilitadoInsertar);
            }
        }

        /// <summary>
        /// Propiedad que indica si se posee el permiso para eliminar
        /// </summary>
        public bool HabilitadoEliminar
        {
            get
            {
                return _habilitadoEliminar;
            }
            set
            {
                if (value == _habilitadoEliminar)
                {
                    return;
                }

                _habilitadoEliminar = value;
                RaisePropertyChanged(PropiedadHabilitadoEliminar);
            }
        }

        /// <summary>
        /// Propiedad que indica si se posee el permiso para modificar
        /// </summary>
        public bool HabilitadoModificar
        {
            get
            {
                return _habilitadoModificar;
            }
            set
            {
                if (value == _habilitadoModificar)
                {
                    return;
                }

                _habilitadoModificar = value;
                RaisePropertyChanged(PropiedadHabilitadoModificar);
            }
        }

        #endregion
    }
}